/**
 * Arete
 * \implements Comparable
 * Classe qui permet la modélisation d'une arête. Cette arête
 * comporte un sommet source ainsi qu'un sommet destination. 
 * Elle a également une valuation (ou poids).
 */
public class Arete implements Comparable<Object> {

	private Sommet source;
	private Sommet destination;
	private int valuation;

	/**
	 * Constructeur par défaut.
	 * Chaque paramètre de la classe est initialisé à une valeur
	 * par défaut.
	 */
	public Arete() {
		source = null ;
		destination = null ;
		valuation = -1 ;
	}

	/**
	 * Constructeur d'une arête complète.
	 * @param source le sommet source de cette arête.
	 * @param destination le sommet destination de cette arête.
	 * @param valuation la valuation de cette arête.
	 */
	public Arete(Sommet source, Sommet destination, int valuation) {
		super();
		this.source = source;
		this.destination = destination;
		this.valuation = valuation;
	}

	/**
	 * Getteur de l'attribut source.
	 * @return la valeur de l'attribut source.
	 */
	public Sommet getSource() {
		return source;
	}
	
	/**
	 * Setteur de l'attribut source.
	 * @param source la nouvelle valeur à affecter à l'attribut source.
	 */
	public void setSource(Sommet source) {
		this.source = source;
	}
	
	/**
	 * Getteur de l'attribut destination.
	 * @return la valeur de l'attribut destination.
	 */
	public Sommet getDestination() {
		return destination;
	}
	
	/**
	 * Setteur de l'attribut destination.
	 * @param destination la nouvelle valeur à affecter à l'attribut destination.
	 */
	public void setDestination(Sommet destination) {
		this.destination = destination;
	}
	
	/**
	 * Getteur de l'attribut valuation.
	 * @return la valeur de l'attribut valuation.
	 */
	public int getValuation() {
		return valuation;
	}
	
	/**
	 * Setteur de l'attribut valuation.
	 * @param valuation la nouvelle valeur à affecter à l'attribut valuation.
	 */
	public void setValuation(int valuation) {
		this.valuation = valuation;
	}

	/**
	 * Surcharge de l'opérateur de comparaison.
	 */
	@Override
	public int compareTo(Object o) {
		int pa1 = ((Arete) o).getValuation();
		int pa2 = this.getValuation();

		if(pa1>pa2)
			return -1;
		else{
			if(pa1<pa2)
				return 1;
			else
				return 0;
		}
	}

	/**
	 * Surcharge de la fonction de génération du hashcode.
	 */
	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result
				+ ((destination == null) ? 0 : destination.hashCode());
		result = prime * result + valuation;
		result = prime * result + ((source == null) ? 0 : source.hashCode());
		return result;
	}

	/**
	 * Surcharge de la fonction d'équivalence.
	 */
	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Arete other = (Arete) obj;
		if (destination == null) {
			if (other.destination != null)
				return false;
		} else if (!destination.equals(other.destination))
			return false;
		if (valuation != other.valuation)
			return false;
		if (source == null) {
			if (other.source != null)
				return false;
		} else if (!source.equals(other.source))
			return false;
		return true;
	}

	/**
	 * Surcharge de l'opérateur toString.
	 */
	@Override
	public String toString() {
		return source+" "+destination+" "+valuation;
	}
}
